
package com.esir.android;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.CharacterIterator;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.text.StringCharacterIterator;
import java.util.Date;
import java.util.Locale;

/**
 * 格式化显示器
 *
 * @author huangrc
 * @date 2016/2/27
 */
@SuppressWarnings("unused")
public final class Formatter {

    private Formatter() {
    }

    /**
     * 四舍五入保留一位有效数字
     */
    private static double formatDouble(double d) {

        BigDecimal bg = BigDecimal.valueOf(d).setScale(1, RoundingMode.UP);
        return bg.doubleValue();
    }

    /**
     * 格式化显示手机号码
     *
     * @param countryCode 区号（国家/地区）
     * @param phoneNumber 手机号码
     * @return 格化显示的字符串; 如果手机号码为空则返回"";
     */
    public static String formatPhoneStr(String countryCode, String phoneNumber) {
        if (isEmpty(phoneNumber)) {
            return "";
        }
        if (isEmpty(countryCode)) {
            return phoneNumber;
        }
        //TODO 格式化显示电话号码
        return countryCode + "-" + phoneNumber;
    }

    /**
     * 格式化显示日期 <P>
     * 根据string.xml资源包提供的样式来格式显示
     * 异常时，将返回默认格式"yyyy-MM-dd"
     *
     * @param time 时间 始于1970-01-01
     * @return 格式化的字符
     */
    public static String formatDate(long time) {
        SimpleDateFormat dateFormat;
        try {
            dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
        } catch (Exception e) {
            dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
        }
        return dateFormat.format(new Date(time));
    }

    /**
     * 格式化显示日期 <P>
     * 根据string.xml资源包提供的样式来格式显示
     * 异常时，将返回默认格式"MM/dd/yyyy"
     *
     * @param time 时间 始于01/01/1970
     * @return 格式化的字符
     */
    public static String formatDateNew(long time) {
        SimpleDateFormat dateFormat;
        try {
            dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault());
        } catch (Exception e) {
            dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.getDefault());
        }
        return dateFormat.format(new Date(time));
    }

    public static String formatTime(long time) {
        SimpleDateFormat dateFormat;
        try {
            dateFormat = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
        } catch (Exception e) {
            dateFormat = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
        }
        return dateFormat.format(new Date(time));
    }

    /**
     * 格式化金额 会根据当前系统的使用语言格式不同的样式
     *
     * @param amount 金额数据
     * @return 格式化的字符 默认"单位1,000,000.00"
     */
    public static String formatAmount(Double amount) {
        if (amount == null) {
            return "--";
        }
        amount = Math.abs(roundMoneyAmount(amount));
        Locale locale = Locale.getDefault();
        NumberFormat formatter = NumberFormat.getNumberInstance(locale);
        formatter.setMinimumFractionDigits(2);
        formatter.setMaximumFractionDigits(2);
        String vietnam = "vi";
        String indonesian = "in";
        if (vietnam.equalsIgnoreCase(locale.getLanguage())) {
            formatter.setMinimumFractionDigits(0);
            formatter.setMaximumFractionDigits(0);
        } else if (indonesian.equalsIgnoreCase(locale.getLanguage())) {
            formatter.setMinimumFractionDigits(0);
            formatter.setMaximumFractionDigits(0);
        }

        return formatter.format(amount);
    }

    /**
     * 格式化带符号的金额
     * <P>数值>0则返回"+单位00.00"，数值<0则返回"-单位00.00",数值=0则反回"单位00.00"
     *
     * @param amount 金额数据
     * @return 格式化的字符
     * @see Formatter#formatAmount(Double)
     */
    public static String signedAmount(double amount) {
        String result = formatAmount(amount);
        if (amount < 0) {
            result = "-".concat(result);
        } else if (amount > 0) {
            result = "+".concat(result);
        }
        return result;
    }

    public static double roundMoneyAmount(double value) {
        if (value > 0) {
            value = Math.floor((value + 0.000001) * 100);
        } else if (value < 0) {
            value = Math.ceil((value - 0.000001) * 100);
        }
        value = value / 100;
        return value;
    }

    /**
     * 去掉字符串多余的空格和头尾的空格
     *
     * @param str str
     * @return 处理过的字符
     */
    public static String escapeSpaces(String str) {
        if (isEmpty(str)) {
            return "";
        }
        return str.replaceAll("[ \t\n\r\f]+", " ").trim();
    }

    /**
     * Returns true if the string is null or 0-length.
     *
     * @param str the string to be examined
     * @return true if str is null or zero length
     */
    private static boolean isEmpty(CharSequence str) {
        return str == null || str.length() == 0;

    }

    /**
     * 格式化显示数字 23,456,789
     *
     * @param number xx,xxx,xxx
     */
    public static void formatDigit(long number) {
        DecimalFormat df1 = (DecimalFormat) DecimalFormat.getInstance();
        df1.setGroupingSize(3);
        System.out.println(df1.format(number));
    }

    /**
     * 将字节大小转换成可读格式（例如：XX MB)
     *
     * @param bytes 大小
     * @return 可读在格式
     */
    public static String humanReadableByteCountSI(long bytes) {
        if (-1000 < bytes && bytes < 1000) {
            return bytes + " B";
        }
        CharacterIterator ci = new StringCharacterIterator("kMGTPE");
        while (bytes <= -999_950 || bytes >= 999_950) {
            bytes /= 1000;
            ci.next();
        }
        return String.format("%.1f %cB", bytes / 1000.0, ci.current());
    }

    /**
     * 将字节大小转换成可读格式（例如：XX MB)
     *
     * @param bytes 大小
     * @return 可读在格式
     */
    public static String humanReadableByteCountBin(long bytes) {
        long absB = bytes == Long.MIN_VALUE ? Long.MAX_VALUE : Math.abs(bytes);
        if (absB < 1024) {
            return bytes + " B";
        }
        long value = absB;
        CharacterIterator ci = new StringCharacterIterator("KMGTPE");
        for (int i = 40; i >= 0 && absB > 0xfffccccccccccccL >> i; i -= 10) {
            value >>= 10;
            ci.next();
        }
        value *= Long.signum(bytes);
        return String.format("%.1f %ciB", value / 1024.0, ci.current());
    }

    /**
     * 将字节大小转换成可读格式（例如：XX MB)
     *
     * @param size 大小
     * @return 可读在格式
     */
    public static String readableFileSize(long size) {
        if (size <= 0) {
            return "0 M";
        }

        final String[] units = new String[]{"B", "KB", "MB", "GB", "TB"};
        int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
        return new DecimalFormat("#,##0.#").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups];
    }
}